package com.sisgesbyte.web.managedBean.proyeccion;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.servlet.http.HttpSession;

import org.primefaces.event.SelectEvent;
import org.primefaces.event.UnselectEvent;

import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.common.Validaciones;
import com.sisgesbyte.dao.beanDao.FiltrosBean;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.services.commonBean.GenericResponse;
import com.sisgesbyte.services.proyeccion.MantProyeccionFfvvDetalleService;
import com.sisgesbyte.services.proyeccion.bean.FiltroOpcionesFFVVBean;
import com.sisgesbyte.services.proyeccion.bean.ListaProyeccionFfvvDetalleBean;
import com.sisgesbyte.services.proyeccion.bean.ListaProyeccionFfvvDetalleResponse;
import com.sisgesbyte.services.ventas.MantEstructuraVentaService;
import com.sisgesbyte.services.ventas.MantenimientoFFVVService;
import com.sisgesbyte.services.ventas.MantenimientoPeriodo;
import com.sisgesbyte.services.ventas.bean.EstructuraVentaFO;
import com.sisgesbyte.services.ventas.bean.EstruturaVentaBean;
import com.sisgesbyte.services.ventas.bean.FFVVBean;
import com.sisgesbyte.services.ventas.bean.ListaEstructuraVentaResponse;
import com.sisgesbyte.services.ventas.bean.ListaFFVVJerarquiaResponse;
import com.sisgesbyte.services.ventas.bean.PeriodoBean;
import com.sisgesbyte.services.ventas.bean.PeriodoListaBean;
import com.sisgesbyte.web.managedBean.common.MantenimientoAbstract;
import com.sisgesbyte.web.managedBean.seguridad.OpcionesControlador;

@ManagedBean
@ViewScoped
public class MantProyeccionFfvvMBean extends MantenimientoAbstract implements Serializable{

	private static final long serialVersionUID = 1L;
	@EJB
	private MantProyeccionFfvvDetalleService mantProyeccionFfvvDetalleService;
	@EJB
	private MantenimientoFFVVService mantenimientoFFVVService;
	@EJB
	private MantEstructuraVentaService mantEstructuraVentaService;
	@EJB
	private MantenimientoPeriodo mantenimientoPeriodo;
	@Inject
	private Validaciones validaciones; 
	
	@ManagedProperty(value = "#{opcionesControlador}")
	private OpcionesControlador opcionesControlador;
	private List<PeriodoBean> listaPeriodos;
	private List<EstruturaVentaBean> listaEstructuraVenta;
	private List<ListaProyeccionFfvvDetalleBean> listaProyeccionFfvvDetalle;
	private List<ListaProyeccionFfvvDetalleBean> selectedProyeccionFfvvDetalle;
	private List<FFVVBean> listaJerarquiaFFVV;
	private int periodoDefault;
	private int idEstructuraVenta;
	private int idFfvv;
	private String tipoMantenimiento;
	private String saved;
	private String txtBuscar;
	
	@PostConstruct
	private void init() {
		saved = "";
		tipoMantenimiento = "";
		txtBuscar = "";
		cargarPeriodos();
		mostrarPeriodoDefault();
		cargarEstructuraVenta();
		inicializar();
	}
	
	@Override
	public void inicializar() {
		
		try{
			System.out.println("periodoDefault : " + periodoDefault);
			System.out.println("idFfvv : " + idFfvv);
			if(periodoDefault == 0 || idFfvv == 0){
				System.out.println("Se debe selecionar periodo y FFVV");
				return;
			}
			FiltroOpcionesFFVVBean filtroOpciones = new FiltroOpcionesFFVVBean();
			filtroOpciones.setIdFfvv(idFfvv);
			filtroOpciones.setIdPeriodo(periodoDefault);
			filtroOpciones.setTxtBuscar(txtBuscar);
			ListaProyeccionFfvvDetalleResponse response = mantProyeccionFfvvDetalleService.mostrarProyeccionFfvvDetalle(ObtenerIdTransaccion(), filtroOpciones);
			if(response.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
				this.listaProyeccionFfvvDetalle = response.getListaProyeccionFfvvDetalle();
			}else{
				this.listaProyeccionFfvvDetalle = new ArrayList<ListaProyeccionFfvvDetalleBean>();
			}
		}catch(Exception e){
			System.out.println("Error al obtener la lista de proyeccion " +  e);
			this.listaProyeccionFfvvDetalle = new ArrayList<ListaProyeccionFfvvDetalleBean>();
		}
		
	}
	public void cargarPeriodos() {
		try {
			PeriodoListaBean periodos = mantenimientoPeriodo.listaPeriodos(ObtenerIdTransaccion());
			this.listaPeriodos = periodos.getListaPeriodos();
		} catch (Exception e) {
			System.out.println("Error al cargar los periodos: " + e);
		}
	}
	public void mostrarPeriodoDefault() {
		for (PeriodoBean ls : getListaPeriodos()) {
			if (ls.getDefecto() != null && ls.getDefecto() == true) {
				setPeriodoDefault(ls.getId());
			}
		}
	}
	
	public void cargarEstructuraVenta(){
		try{
			EstructuraVentaFO filtroOpciones = new EstructuraVentaFO();
			filtroOpciones.setActive(true);
			filtroOpciones.setTxtBuscar(null);
			ListaEstructuraVentaResponse response = mantEstructuraVentaService.mostrarEstructuraVenta(ObtenerIdTransaccion(), filtroOpciones);
			if(response.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
				this.listaEstructuraVenta = response.getListaEstructuraVenta();
			}else{
				this.listaEstructuraVenta = new ArrayList<EstruturaVentaBean>();
			}
		}catch(Exception e){
			System.out.println("Error al listar Estructura de ventas " + e);
			this.listaEstructuraVenta = new ArrayList<EstruturaVentaBean>();
		}
	}
	public void cargarFFvv(){
		
		if(idEstructuraVenta < 1){
			System.out.println("Debe seleccionar la estructura de venta ");
			return;
		}
		try{
			FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
			List<Object> valores = new ArrayList<>();
			List<FiltrosBean> filtro = new ArrayList<FiltrosBean>();
				FiltrosBean filtroFfvv = new FiltrosBean();
				List<String> campoFfvv = new ArrayList<String>();
				campoFfvv.add("ee.estructura_venta_id");
				campoFfvv.add("ee.active");
				filtroFfvv.setCampos(campoFfvv);
				filtroFfvv.setOperador("=");
				filtro.add(filtroFfvv);
				valores.add(idEstructuraVenta);
				valores.add(true);

			filtroSQL.setListaFiltros(filtro);
			filtroSQL.setListaValores(valores);
			ListaFFVVJerarquiaResponse response = mantenimientoFFVVService.listaFFVV(ObtenerIdTransaccion(), filtroSQL);
			if(response.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
				this.listaJerarquiaFFVV = response.getListaJerarquiaFFVV();
			}else{
				this.listaJerarquiaFFVV = new ArrayList<FFVVBean>();
			}
		}catch(Exception e){
			System.out.println("Error al cargar la lista de FFVV " + e);
			this.listaJerarquiaFFVV = new ArrayList<FFVVBean>();
		}
	}
	@Override
	public void unSelect(UnselectEvent event) {
		opcionesControlador.habilitarControles(selectedProyeccionFfvvDetalle.size());
	}

	@Override
	public void checkSelect(SelectEvent event) {
		opcionesControlador.habilitarControles(selectedProyeccionFfvvDetalle.size());
	}

	@Override
	public void seleccionarItem(SelectEvent event) {
		opcionesControlador.habilitarControles(selectedProyeccionFfvvDetalle.size());
	}

	@Override
	public void dobleSelect(SelectEvent event) {
		List<ListaProyeccionFfvvDetalleBean> selected = new ArrayList<ListaProyeccionFfvvDetalleBean>();
		selected.add((ListaProyeccionFfvvDetalleBean) event.getObject());
		setSelectedProyeccionFfvvDetalle(selected);
		setSaved("");
		opcionesControlador.habilitarControles(selectedProyeccionFfvvDetalle.size());
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE);
	}

	@Override
	public void nuevoItem() {
		setSaved("");
		limpiarFormulario();
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_NUEVO);
	}

	@Override
	public void editItem() {
		setSaved("");
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE);
	}

	@Override
	public void updateInsertItem() {
		if (tipoMantenimiento.equalsIgnoreCase(ConstantesInternasSistema.TIPO_MANTENIMIENTO_NUEVO)) {
			guardarItem();
		}
		if (tipoMantenimiento.equalsIgnoreCase(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE)) {
			modificarItem();
		}
	}

	@Override
	public String ObtenerIdTransaccion() {
		FacesContext fCtx = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) fCtx.getExternalContext().getSession(false);
		String sessionId = session.getId().replace(".undefined", "");
		return sessionId;
	}

	@Override
	public void guardarItem() {
		GenericResponse response = null;
		try {
			for (ListaProyeccionFfvvDetalleBean bean : listaSeleccionados(selectedProyeccionFfvvDetalle)){
				bean.setEmpleadoEstructuraId(idFfvv);
				bean.setPeriodoId(periodoDefault);
				response = mantProyeccionFfvvDetalleService.nuevaProyeccioFfvvDetalle(ObtenerIdTransaccion(), bean);
				if (response.getCodigoRespuesta().equals( ConstantesInternasSistema.CODIGO_EXITO)) {
					setSaved(ConstantesInternasSistema.SAVED_ITEM_OK);
					System.out.println("Se registro Correctamente");
				} else {
					setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
					System.out.println("Hubo un error al Registrar " + response.getCodigoRespuesta() + " - " + response.getMensajeRespuesta());
				}
			}
			limpiarFormulario();
			inicializar();
		} catch (Exception e) {
			setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
			System.out.println("Error en el proceso " + e);
		}
	}

	@Override
	public void modificarItem() {
		GenericResponse response = null;
		try {
			for (ListaProyeccionFfvvDetalleBean bean : listaSeleccionados(selectedProyeccionFfvvDetalle)) {
				bean.setEmpleadoEstructuraId(idFfvv);
				bean.setPeriodoId(periodoDefault);
				response = mantProyeccionFfvvDetalleService.editarProyeccionFfvvDetalle(ObtenerIdTransaccion(), bean);
				if (response.getCodigoRespuesta().equals( ConstantesInternasSistema.CODIGO_EXITO)) {
					setSaved(ConstantesInternasSistema.SAVED_ITEM_OK);
					System.out.println("Se Acualizo correctamente");
				} else {
					setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
					System.out.println("Hubo un Error al Actualizar de BD " + response.getCodigoRespuesta() + " - " + response.getMensajeRespuesta());
				}
			}
			inicializar();
		} catch (Exception e) {
			System.out.println("Error en el proceso " + e);
		}
	}

	@Override
	public void eliminarItem() {
		GenericResponse response = null;
		try {
			
			for (ListaProyeccionFfvvDetalleBean bean : selectedProyeccionFfvvDetalle) {
				bean.setEmpleadoEstructuraId(idFfvv);
				bean.setPeriodoId(periodoDefault);
				response = mantProyeccionFfvvDetalleService.deleteProyeccionFfvvDetalle(ObtenerIdTransaccion(), bean);
				if (response.getCodigoRespuesta().equals(ConstantesInternasSistema.CODIGO_EXITO)) {
					System.out.println("Se elimino Correctamente");
				} else {
					System.out.println("No se pudo Eliminar de BD "
							+ response.getCodigoRespuesta() + " - "
							+ response.getMensajeRespuesta());
				}
			}
			inicializar();
			opcionesControlador.desactivarControles();
		} catch (Exception e) {
			System.out.println("Hubo un error al tratar de Eliminar " + e);
		}
	}

	@Override
	public void actualizarEstado() {
		
	}

	@Override
	public void limpiarFormulario() {
		List<ListaProyeccionFfvvDetalleBean> listaBean = new ArrayList<ListaProyeccionFfvvDetalleBean>();
		ListaProyeccionFfvvDetalleBean bean = new ListaProyeccionFfvvDetalleBean();
		bean.setCodProd("");
		bean.setPeriodoId(periodoDefault);
		listaBean.add(bean);
		setSelectedProyeccionFfvvDetalle(listaBean);
	}

	@Override
	public void crearFiltro() {
		// TODO Auto-generated method stub
		
	}
	/*
	 * Metodo para recorrer y validar los tipos de campos seleccionados
	 */
	public List<ListaProyeccionFfvvDetalleBean> listaSeleccionados(List<ListaProyeccionFfvvDetalleBean> listaRequest) {
		List<ListaProyeccionFfvvDetalleBean> response = new ArrayList<ListaProyeccionFfvvDetalleBean>();
		for (ListaProyeccionFfvvDetalleBean listaBean : listaRequest) {
			ListaProyeccionFfvvDetalleBean bean = new ListaProyeccionFfvvDetalleBean();
				bean.setCantidadProyectada(listaBean.getCantidadProyectada());
				bean.setCategoriaProducto(validaciones.validarCamposString(listaBean.getCategoriaProducto()));
				bean.setCategoriaProductoId(listaBean.getCategoriaProductoId());
				bean.setCodigoBanda(validaciones.validarCamposString(listaBean.getCodigoBanda()));
				bean.setCodProd(validaciones.validarCamposString(listaBean.getCodProd()));
				bean.setId(listaBean.getId());
				bean.setMarca(validaciones.validarCamposString(listaBean.getMarca()));
				bean.setMarcaId(listaBean.getMarcaId());
				bean.setPeriodoId(listaBean.getPeriodoId());
				bean.setPrecioPromedio(listaBean.getPrecioPromedio());
				bean.setProducto(validaciones.validarCamposString(listaBean.getProducto()));
				bean.setProductoId(listaBean.getProductoId());
				bean.setProyeccionFfvvId(listaBean.getProyeccionFfvvId());
				bean.setEmpleadoEstructuraId(listaBean.getEmpleadoEstructuraId());
			response.add(bean);
		}
		return response;
	}
	public OpcionesControlador getOpcionesControlador() {
		return opcionesControlador;
	}

	public void setOpcionesControlador(OpcionesControlador opcionesControlador) {
		this.opcionesControlador = opcionesControlador;
	}

	public List<PeriodoBean> getListaPeriodos() {
		return listaPeriodos;
	}

	public void setListaPeriodos(List<PeriodoBean> listaPeriodos) {
		this.listaPeriodos = listaPeriodos;
	}

	public List<EstruturaVentaBean> getListaEstructuraVenta() {
		return listaEstructuraVenta;
	}

	public void setListaEstructuraVenta(
			List<EstruturaVentaBean> listaEstructuraVenta) {
		this.listaEstructuraVenta = listaEstructuraVenta;
	}

	public List<ListaProyeccionFfvvDetalleBean> getListaProyeccionFfvvDetalle() {
		return listaProyeccionFfvvDetalle;
	}

	public void setListaProyeccionFfvvDetalle(
			List<ListaProyeccionFfvvDetalleBean> listaProyeccionFfvvDetalle) {
		this.listaProyeccionFfvvDetalle = listaProyeccionFfvvDetalle;
	}

	public List<ListaProyeccionFfvvDetalleBean> getSelectedProyeccionFfvvDetalle() {
		return selectedProyeccionFfvvDetalle;
	}

	public void setSelectedProyeccionFfvvDetalle(
			List<ListaProyeccionFfvvDetalleBean> selectedProyeccionFfvvDetalle) {
		this.selectedProyeccionFfvvDetalle = selectedProyeccionFfvvDetalle;
	}

	public int getPeriodoDefault() {
		return periodoDefault;
	}

	public void setPeriodoDefault(int periodoDefault) {
		this.periodoDefault = periodoDefault;
	}

	public String getTipoMantenimiento() {
		return tipoMantenimiento;
	}

	public void setTipoMantenimiento(String tipoMantenimiento) {
		this.tipoMantenimiento = tipoMantenimiento;
	}

	public String getSaved() {
		return saved;
	}

	public void setSaved(String saved) {
		this.saved = saved;
	}

	public String getTxtBuscar() {
		return txtBuscar;
	}

	public void setTxtBuscar(String txtBuscar) {
		this.txtBuscar = txtBuscar;
	}

	public int getIdFfvv() {
		return idFfvv;
	}

	public void setIdFfvv(int idFfvv) {
		this.idFfvv = idFfvv;
	}

	public List<FFVVBean> getListaJerarquiaFFVV() {
		return listaJerarquiaFFVV;
	}

	public void setListaJerarquiaFFVV(List<FFVVBean> listaJerarquiaFFVV) {
		this.listaJerarquiaFFVV = listaJerarquiaFFVV;
	}

	public int getIdEstructuraVenta() {
		return idEstructuraVenta;
	}

	public void setIdEstructuraVenta(int idEstructuraVenta) {
		this.idEstructuraVenta = idEstructuraVenta;
	}
	
}
